#include <cstdio>
#include <algorithm>
using namespace std;

const int N = 2e5 + 5;   // 数组a的最大长度（远大于题目实际需要，保证安全）
const int C = 1e6 + 5;   // vis数组最大长度，用于标记出现过的数

int n;
int a[N];    // 存储Recamán数列
int vis[C];  // 标记某个数是否已经在数列中出现过

// 冒泡排序，将数组a的前n项从小到大排序
void bubble_sort(int *a, int n) {
    bool flag = true;
    while (flag) {
        flag = false;
        for (int i = 1; i < n; ++i) {
            if (a[i] > a[i + 1]) {
                flag = true;
                int t = a[i];
                a[i] = a[i + 1];
                a[i + 1] = t;
            }
        }
    }
}

int main() {
    scanf("%d", &n); // 读入n

    a[1] = 1;        // Recamán数列第一项为1
    vis[1] = 1;      // 标记1已经出现

    // 生成Recamán数列的第2到第n项
    for (int i = 2; i <= n; i++) {
        // 如果前一项减i小于等于0，或者这个数已经出现过
        if (a[i - 1] - i <= 0 || vis[a[i - 1] - i])
            a[i] = a[i - 1] + i; // 取前一项加i
        else
            a[i] = a[i - 1] - i; // 否则取前一项减i
        vis[a[i]] = 1;           // 标记当前数已经出现
    }

    // 对a[1]~a[n]进行排序
    bubble_sort(a, n);

    // 输出排序后的结果
    for (int i = 1; i <= n; i++)
        printf("%d%c", a[i], " \n"[i == n]); // 最后一个数后输出换行，其余输出空格

    return 0;
}